package LearnAlgorithm.e_多维数组and矩阵;


public class c二维数组Z形打印 {
	public static void main(String[] args) {
		int[][] matrix = new int[][] {
			{1,2,3,4},
			{5,0,7,8},
			{9,10,11,12},
			{13,14,15,16},
		};
		
		printZ(matrix);
	}
	
	/**
	 * Z形打印
	 * 其实不难，就是要把情况分好
	 * 2个大情况：上坡、下坡
	 * 上坡3小情况：上到行顶得右移；上到右边界得下移；上坡线中接着右上
	 * 下坡3小情况：下到行底得右移；下到左边界得下移；下坡线中接着左下
	 * @param matrix
	 */
	public static void printZ(int[][] matrix) {
		int TotalRow = matrix.length;
		int TotalCol = matrix[0].length;
		int row = 0;
		int col = 0;
		boolean left2fight = true;//从左下到右上地打印；false就是反过来
		while (row < TotalRow && col < TotalCol) {
			if (left2fight) {//上坡
				System.out.print(matrix[row][col] + " ");//打印元素A
				if (row == 0 && col < TotalCol - 1) {//打印后判断此元素A是否位于第一row，并且元素的col是否不在最后一col(最后一col是matrix[0].length-1，也就是TotalCol - 1)
					left2fight = !left2fight;//改变开关
					col++;//通过判断，那只能向(这个元素A)右走
					continue;
				} else if (row > 0 && col == TotalCol - 1) {//打印后判断此元素A是否位于末尾col，并且元素的row是否不在第一row
					left2fight = !left2fight;
					row++;//通过判断，那只能向(这个元素A)下走
					continue;
				} else {//就在上坡线；向右上走
					row--;
					col++;
				}
			} else {//下坡
				System.out.print(matrix[row][col] + " ");//打印元素B
				if (col == 0 && row < TotalRow - 1) {//打印后判断此元素B是否位于第一col，并且元素的row是否不在第一row
					left2fight = !left2fight;
					row++;//通过判断，那只能向(这个元素B)下走
					continue;
				} else if (row == TotalRow - 1) {//打印后判断此元素B是否位于末尾row
					left2fight = !left2fight;
					col++;//通过判断，那只能向(这个元素B)右走
					continue;
				} else {//就在下坡线；向左下走
					row++;
					col--;
				}
			}
		}
	}
}
